var arr = [1, 2, 3, 4, 2];
var count = 0;
for (var i = 1; i <= arr.length; i++) {
    if (arr[i] == 2) {
        count++;
    }
}
console.log(count); // 2

var arr = ['a', 'b', 'c', 'b', 'a', 'c', 'a'];
var obj = {};
for (var i = 0; i < arr.length; i++) {
    var key = arr[i];
    // if (obj[key]) {
    //   obj[key] += 1;
    // } else {
    //   obj[key] = 1;
    // }
    // 简写：
    obj[key] ? obj[key] += 1 : obj[key] = 1;

}
console.log(obj);

/*
1.数组方法里面的push pop unshift shift的作用分别是什么，他们的返回值又是什么？
    push：
      - 作用：向数组的末尾添加数据
      - 返回值：添加元素后数组的长度
    
    pop:
      - 作用：删除数组的最后一个数据
      - 返回值：被删除的数据

    unshift:
      - 作用：在数组的最前面插入一条数据
      - 返回值：添加过后的数组长度

    shift：
      - 作用：删除数组最前面的一个数据
      - 返回值：被删除的数据

2.移除数组 arr["西瓜","香蕉","菠萝"]中除西瓜外的所有元素，不要使用第二个数组
    var arr = ["西瓜", "香蕉", "菠萝"];
    for (var i = 0; i <= arr.length - 1; i++) {
        arr.pop();
    }
    console.log(arr);

    3.移除数组 arr[1, 2, 3, 4, 2] 中的 2。不要直接修改数组 arr，结果返回新的数组
    var arr = [1, 2, 3, 4, 2];
    var res = [];
    for (var i = 0; i <= arr.length - 1; i++) {
        if(arr[i] != 2){
            res.push(arr[i]);
        }
    }
    console.log(res);

4.定义一个函数,能在数组 arr[1, 2, 3, 4, 2] 的 "2"后面添加元素 "kern"。不要直接修改数组 arr，结果返回新的数组即调用函数后返回的结果为[1, 2,'kern',3, 4, 2,'kern']
    function fn(a,b,c) {
      var newArr = [];
      for (var i = 0; i <= a.length - 1; i++) {
          if(a[i] == b){
            newArr.push(arr[i],c)
          }else{
            newArr.push(arr[i])
          }
      }
      return newArr;
    }
    var arr = [1, 2, 3, 4, 2];
    console.log(fn(arr,2,'kern')); // (7) [1, 2, 'kern', 3, 4, 2, 'kern']

5.统计数组 arr[1, 2, 3, 4, 2] 中 2 出现的次数
    var arr = [1, 2, 3, 4, 2];
    var count = 0;
    for (var i = 1; i <= arr.length; i++) {
        if (arr[i] == 2) {
            count++;
        }
    }
    console.log(count); // 2

6. 创建一个对象有那两种方式
    (1)字面量创建对象 -> var obj = {}
    (2)内置构造函数创建对象 -> var object= new Object()

7. 请举例说明，对象的基本操作的两种语法
    (1)点语法
      - 增加：对象名.键名 = 值  例：obj.name = "kern";
      - 删除：delete 对象名.键名  例：delete obj.name;
      - 修改：对象名.键名 = 值  例：obj.name = "bluej";
      - 查：对象名.键名  例：obj.name4;

    (2)数组关联语法
      - 增加：对象名["键名"] = 值 例：obj["gender"] = "man";
      - 删除：delete 对象名["键名"]  例：delete obj["gender"];
      - 修改：对象名["键名"] = 值  例：obj["gender"] = "women";
      - 查：对象名["键名"]  例：obj["gender"];

8.对象的curd，两种语法有什么区别 
    (1)对于名字的操作
      - 符合变量命名规则和规范的都可以书写
      - 纯数字命名法只能使用数组关联语法，不能使用点语法
      - 带有特殊符号的，只能使用数组关联语法，不能使用点语法
    
    (2)和变量相关的时候
      - 点语法：不管如何，都不能和变量产生联系，始终都是访问对象的某一个准确的键名
      - 数组关联语法：`[]`内写的是一个变量，把变量解析出来填充在`[]`里面，对象和变量产生了关联

9.对象怎么遍历？那个是键名，那个是键值
对象使用 for in 进行遍历
在 for(var key in obj){} 中 obj[key] 拿到的是键值，key是键名

10.简单和复杂数据类型在存储上的区别是什么？
简单数据类型直接按值存放在栈内存中。
复杂数据类型会将自己的一个指针（地址）存放在栈中，真实的数据存放在堆中。

11.给一个不多于5位的正整数，要求：一、求它是几位数，二、逆序打印出各位数字。
    var num = 3045;
    var n = 1;
    for (var i = 1; i <= num.toString().length; i++) {
        var res = parseInt((num / n) % 10);
        n *= 10;
        console.log(res); // 5 4 0 3
    }
    console.log(num + '是' + num.toString().length + '位数'); // 3045是4位数

12.如下代码会打印什么？请写出分析过程
      var b = "boy";
      console.log(b); // boy，b在此之前已被定义
      
      function fighting() {
        console.log(a); // undefined  a在此之前未被定义
        console.log(c); // undefined  c在此之前未被定义

        if (a === "apple") {
          a = "Alice";
        } else {
          a = "Ada";
        }
        console.log(a); // Ada  a在此之前未被定义，判断中走else并赋值为"Ada"

        var a = "Andy";
        middle();

        function middle() {
          console.log(c++); // NaN  undefined++
          var c = 100;
          console.log(++c); // 101  ++先赋值后运算
          small();
          function small() {
            console.log(a); // Andy  middle()在a定义之后调用
          }
        }

        var c = (a = 88);
        function bottom() {
          b = "baby";
          console.log(b); // baby  fighting()在b定义之后调用，且bottom()在fighting()内被调用，所以 b 重新赋值为 "baby"
        }
        bottom();
      }

      fighting();
      console.log(b); // baby  fighting()在b定义之后调用，且bottom()在fighting()内被调用，所以 b 重新赋值为 "baby"
*/